package com.charging.business.vo.obj;

import com.charging.business.exception.CustomizeException;
import com.charging.business.utils.PayUtil;
import com.charging.business.utils.ToolsUtil;
import lombok.Data;

/**
 * @author JerryLu
 * @date 2024/11/12 14:51
 * @description 车辆特情在线计费响应接口中的分省信息
 */
@Data
public class ProvinceFee {
    /**
     * 省份编码
     * 必填：是
     */
    public Integer provinceId;

    /**
     * 应收总金额
     * 必填：是
     * 单位： 分
     * 通行介质为：OBU时，计费模块输出 payFee 累计，用于结算。
     * 通行介质为：CPC、纸券、无介质时，由计费模块最后一次计费输出的(feeSpare1)，用于结算
     */
    public Integer payFee = 0;

    /**
     * 实收总金额
     * 必填：是
     * 单位： 分
     * 计费模块输出 realFee累计，参考值，不可用于结算。
     */
    public Integer fee = 0;

    /**
     * 优惠总金额
     * 必填：是
     * 单位： 分
     * 计费模块输出 discountFee累计，用于结算
     */
    public Integer discountFee = 0;

    /**
     * 拆分总金额
     * 必填：是
     * 单位： 分
     * 通行介质为：CPC、纸券、无介质时，由计费模块最后一次计费输出的（feeSpare1），用于现场收费。
     * 通行介质为：OBU时，且折扣时，由计费模块最后一次计费中输出的（feeProvSumLocal ，用于现场收费。
     * 通行介质为：OBU时，如不折扣，等同于通行介质为 CPC 计费， 由计费模块最后一次计费输出的(feeSpare1），用于现场收费
     */
    public Integer splitAmount = 0;

    /**
     * 里程总数
     * 必填：是
     * 计费模块输出 feeSpare2累计
     */
    public Integer feeMileage = 0;

    /**
     * 计费收费单元数量
     * 必填：是
     */
    public Integer tollIntervalsCount = 0;

    /**
     * 后台收费单元编号组合
     * 必填：是
     * 使用“|”分隔
     */
    public String oriintervalsGroup = "";

    /**
     * 计费收费单元编号组合
     * 必填：是
     * 使用“|”分隔
     */
    public String tollIntervalsGroup = "";

    /**
     * 计费收费单元的时间组合
     * 必填：是
     * 格式：yyyy-MM-ddTHH:mm:sss
     * 使用“|”分隔
     */
    public String transTimeGroup = "";

    /**
     * 计费收费单元实收金额组合
     * 必填：是
     * 单位： 分。 使用“|”分隔
     */
    public String feeGroup = "";

    /**
     * 计费收费单元优惠金额组合
     * 必填：是
     * 单位： 分。 优惠金额为优惠减免金额， 未优惠填 0。 使用“|”分隔
     */
    public String discountFeeGroup = "";

    /**
     * 检查及计费修正
     *
     * @param type - 介质类型
     * 1-OBU
     * 2-CPC 卡
     * 3-纸券
     * 9-无通行介质
     */
    public void checkProvince(int type) throws CustomizeException {
        if (provinceId == null) {
            throw new CustomizeException("provinceId(省份编码)为null");
        }
        if (splitAmount == null) {
            throw new CustomizeException("splitAmount(拆分总金额)为null");
        }
        if (feeMileage == null) {
            throw new CustomizeException("feeMileage(里程总数)为null");
        }
        if (tollIntervalsCount == null) {
            throw new CustomizeException("tollIntervalsCount(计费收费单元数量)为null");
        }
        if (tollIntervalsGroup == null) {
            throw new CustomizeException("tollIntervalsGroup(后台收费单元编号组合)为null");
        }
        if (transTimeGroup == null) {
            throw new CustomizeException("transTimeGroup(计费收费单元编号组合)为null");
        }
        if (feeGroup == null) {
            throw new CustomizeException("feeGroup(计费收费单元实收金额组合)为null");
        }
        if (discountFeeGroup == null) {
            throw new CustomizeException("discountFeeGroup(计费收费单元优惠金额组合)为null");
        }

        String[] fees = feeGroup.split("\\|");
        String[] discounts = discountFeeGroup.split("\\|");
        String[] times = transTimeGroup.split("\\|");
        String[] intervs = tollIntervalsGroup.split("\\|");
        if (tollIntervalsCount != fees.length ||
                fees.length != discounts.length ||
                fees.length != times.length ||
                fees.length != intervs.length)
        {
            throw new CustomizeException("在线计费收费单元数量错误");
        }

        // 计费修正
        fee = 0;
        discountFee = 0;
        for (int aa = 0; aa < discounts.length; aa++) {
            fee += ToolsUtil.a2i(fees[aa]);
            discountFee += ToolsUtil.a2i(discounts[aa]);
        }

        // 通行介质为：OBU时，计费模块输出payFee累计，用于结算
        if (type == 1) {
            payFee = fee + discountFee;
        } else {
            // 通行介质为：CPC、纸券、无介质时，由计费模块最后一次计费输出的（feeSpare1），用于结算
            payFee = PayUtil.mtcFinalFee(fee + discountFee);
            //discountFee = payFee - splitAmount;
            //if (discountFee<0) {
            //	payFee = splitAmount;
            //	discountFee = 0;
            //}
        }

        // 校验
        if (payFee < splitAmount) {
            payFee = splitAmount;
        }
    }
}
